package com.isoft.systemprovidor.easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson2.JSON;
import com.isoft.systemprovidor.entity.PhoneBook;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.List;
@Slf4j
public class TestEasyExcel {

    String PATH = "D:\\liar\\Pictures\\rongchuangwork\\GeneralProject2\\TMIM_SYSTEM_Back\\SystemProvidor\\src\\main\\java\\com\\isoft\\systemprovidor\\easyexcel\\";

    //根据list写入Excel
    private List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    private List<PhoneBook> phoneBookdata() {
        List<PhoneBook> list = ListUtils.newArrayList();
        for (int i = 0; i < 20; i++) {
            PhoneBook phoneBook = new PhoneBook();
            phoneBook.setUsername("用户" + (i+1));
            list.add(phoneBook);
        }
        return list;
    }




    /**
     * 最简单的写
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 直接写即可
     */
    @org.junit.Test
    public void simpleWrite() {
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入


        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName = PATH + "电话簿上传模板.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, PhoneBook.class)
                .sheet("模板")
                .doWrite(() -> {
                    // 分页查询数据
                    return phoneBookdata();
                });

        /*// 写法2
        String fileName = PATH + "电话簿上传模板.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("测试模板").doWrite(data());*/

    }




    /**
     * 最简单的读
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link DemoDataListener}
     * <p>
     * 3. 直接读即可
     */
    @org.junit.Test
    public void simpleRead() {
        // 写法1：JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        String fileName = PATH + "电话簿上传模板.xlsx";
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(fileName, PhoneBook.class, new PageReadListener<PhoneBook>(dataList -> {
            for (PhoneBook phoneBook : dataList) {
                log.info("读取到一条数据{}", JSON.toJSONString(phoneBook));
            }
        })).sheet().doRead();

        /*// 写法2：
        // 匿名内部类 不用额外写一个DemoDataListener
        String fileName = PATH + "电话簿上传模板.xlsx";
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, DemoData.class, new ReadListener<DemoData>() {
            *//*单次缓存的数据量*//*

            public static final int BATCH_COUNT = 100;
            *//*临时存储*//*

            private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

            @Override
            public void invoke(DemoData data, AnalysisContext context) {
                cachedDataList.add(data);
                if (cachedDataList.size() >= BATCH_COUNT) {
                    saveData();
                    // 存储完成清理 list
                    cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
                }
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                saveData();
            }
             *//*加上存储数据库*//*
            private void saveData() {
                log.info("{}条数据，开始存储数据库！", cachedDataList.size());
                log.info("存储数据库成功！");
            }
        }).sheet().doRead();*/

    }


}
